#include "FrameDelUsuario.h"
#include "ParserConsultas.h"
#include "FabricaDeComponentes.h"
#include "Respuesta.h"

class Cliente;

FrameDelUsuario::FrameDelUsuario(const char* archivoConsultas, GestorArchivoConfiguracion &gestor, Cliente* cli):
	parser(archivoConsultas), gestorConfiguracion(gestor), cliente(cli) {
	set_border_width(5);
	//	set_resizable(false);
//	set_size_request(900, 500);

	inicializarComponentes();
	show_all_children();
}


void FrameDelUsuario::setRespuesta(Respuesta* respuesta) {
	/*
	AQUI NECESITO EXTRAER EL NUMERO DE CONSULTA DE LA rESPUESTA Y CON ESE NUMERO
	EXTRAER DEL MAP "frameConsulta"	EL PUNTERO Y A ESE PUNTERO ENVIARLE LA RESPUESTA

	FrameConsulta* frame = framesDeConsulta[.............numero extraido......]
	frame->setRespuesta(respuesta);
	*/
	unsigned int id_consulta = respuesta->getIdConsulta();
	FrameConsulta* frame_cons = framesDeConsulta[id_consulta];
	frame_cons->setRespuesta(respuesta);
}


// creo q es un metodo innecesario
void FrameDelUsuario::inicializarComponentes() {
	parser.iniciarParseo();

	if(parser.getEstado()) {
		construirComponentes();
	//	conectarManejadoresDeEventos();
	}
	else {
		mensajeError.set_text(parser.getError());
		add(mensajeError);
	}
}


void FrameDelUsuario::construirComponentes() {
	FabricaDeComponentes fabrica(parser, gestorConfiguracion);
	//parser.mostrar();
	fabrica.crearComponentes(cliente);

	std::vector<std::string>::iterator iTablas = fabrica.getDatosDeTablas().begin();
	for(; iTablas != fabrica.getDatosDeTablas().end(); iTablas++) {
		Gtk::HBox* cajaHorizontal = Gtk::manage(new Gtk::HBox);

		std::vector<FrameConsulta*>& framesDeUnTab = fabrica.getFramesDeTabla(*iTablas);
		std::vector<FrameConsulta*>::iterator it = framesDeUnTab.begin();
		for( ; it != framesDeUnTab.end(); it++) {
			// le paso el cliente al portal para q le pueda consultar
			(*it)->getPortal()->setCliente(cliente);
			cajaHorizontal->pack_start(**it, Gtk::PACK_SHRINK);


			/* ESTO ES NECESARIO PARA QUE LA VENTANA SEPA A QUE FRAME ENVIAR LA RESPUESTA
			 * EL IDENTIFICADOR DEL FRAME, LO USARA EL PORTAL COMO NUMERO DE CONSULTA. ALCREAR LA CONSULTA
			 * ESTE NUMERO ES UNICO POR CADA FRAMECONSULTA, INCLUSO aunque HAYA MAS DE UN TAB DE CONSULTA
			 */
			framesDeConsulta[(*it)->getIdentificador()] = *it;
		}
		solapa.append_page(*cajaHorizontal, fabrica.getNombreDeTabla(*iTablas));
	}
	add(solapa);
}


void FrameDelUsuario::portalesCarguenCombos() {
	std::map<unsigned int, FrameConsulta*>::iterator it = framesDeConsulta.begin();
	for(; it != framesDeConsulta.end(); it++)
		(it->second)->getPortal()->cargarCombos();
}

FrameDelUsuario::~FrameDelUsuario(){}
